﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using Microsoft.Phone.Controls;

namespace HCMUS_SearchService_Group2
{
    /////////////////////////////////////////////////
    /// \brief Giao diện hiển thị danh sách kết quả.
    /// \author Ngô Trọng Nghĩa -   0912305.
    /// \details <h3>Hiển thị danh sách kết quả và xử lý tương tác</h3>
    ////////////////////////////////////////////////

    public partial class ListResultPage : PhoneApplicationPage
    {
        private bool Selected;      
        private List<int> Price;
        private List<StreetDTO> lstStreet;
        private List<string> lstService;
        /////////////////////////////////////////////////
        /// \brief Hàm khởi tạo.
        /// \param[in] Không
        /// \param[out] Không
        /// \returns Không
        /// \details <h3>Khởi tạo các biến và các components.</h3>
        /////////////////////////////////////////////////
        public ListResultPage()
        {
            InitializeComponent();
        }

        /////////////////////////////////////////////////
        /// \brief Hàm bắt sự kiện chuyển trang.
        /// \param[in] NavigationEventArgs
        /// \param[out] Không
        /// \returns Không
        /// \details <h3>Hiển thị trang với kết quả có được từ MainPage.</h3>
        /////////////////////////////////////////////////
        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            this.Selected = false;
            this.nItem.Text = string.Format("Have {0} results.", MainPage.result.Count);
            this.ResultsList.ItemsSource = MainPage.result;
            this.ComboBoxPrice.Visibility = System.Windows.Visibility.Collapsed;
            this.ComboBoxStreet.Visibility = System.Windows.Visibility.Collapsed;
            this.ComboBoxService.Visibility = System.Windows.Visibility.Collapsed;
        }

        public void getStreets()
        {
            IEnumerable<string> streets = new List<string>();
            streets = (from data in MainPage.result
                       select data.StreetName).Distinct();
            lstStreet = new List<StreetDTO>();
            foreach (var streetName in streets)
            {
                StreetDTO obj = new StreetDTO() { StreetName = streetName };
                lstStreet.Add(obj);
            }
            this.selectedStreet.ItemsSource = lstStreet;
        }

        /////////////////////////////////////////////////
        /// \brief Hàm bắt lệnh khi chọn một kết quả dịch vụ.
        /// \param[in] object
        /// \param[in] RoutedEventArgs
        /// \param[out] Không
        /// \returns Không
        /// \details <h3>Bắt lệnh khi người dùng nhấn vào một kết quả dịch vụ.</h3>
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            /// \see Process_Click(object)
            this.Process_Click(sender);
        }

        /////////////////////////////////////////////////
        /// \brief Hàm xử lý khi chọn một kết quả dịch vụ.
        /// \param[in] object
        /// \param[out] Không
        /// \returns Không
        /// \details <h3>Các bước thực hiện:</h3>
        /////////////////////////////////////////////////
        private void Process_Click(object sender)
        {
            /// - Bước 1: Lấy chỉ số của kết quả được chọn.
            Button temp = sender as Button;
            int index;
            if (null != temp)
            {
                index = (int)((StackPanel)temp.Content).Tag;
            }
            else
            {
                index = 0;
            }

            /// - Bước 2: Chuyển hướng qua trang hiển thị chi tiết dịch vụ
            NavigationService.Navigate(new Uri("/DetailResultPage.xaml?result=" + index.ToString(), UriKind.Relative));
        }

        /////////////////////////////////////////////////
        /// \brief Hàm bắt lệnh khi nhấn vào icon trên ApplicationBar.
        /// \param[in] object
        /// \param[in] EventArgs
        /// \param[out] Không
        /// \returns Không
        /// \details <h3>Bắt lệnh khi người dùng nhấn vào icon có chức năng Back. </h3>
        /////////////////////////////////////////////////
        private void BackApplicationBarIconButton_Click(object sender, EventArgs e)
        {
            /// \see GoBack();
            this.GoBack();
        }

        /////////////////////////////////////////////////
        /// \brief Hàm xử lý khi nhấn vào icon Back trên ApplicationBar.
        /// \param[in] Không
        /// \param[out] Không
        /// \returns Không
        /// \details <h3> Quay lại MainPage</h3>
        /////////////////////////////////////////////////
        private void GoBack()
        {
            NavigationService.GoBack();
        }

        /////////////////////////////////////////////////
        /// \brief Hàm bắt lệnh khi nhấn vào icon trên ApplicationBar.
        /// \param[in] object
        /// \param[in] EventArgs.
        /// \param[out] Không
        /// \returns Không
        /// \details <h3>Bắt lệnh khi người dùng nhấn vào icon có chức năng Forward. </h3>
        /////////////////////////////////////////////////
        private void FowardApplicationBarIconButton_Click(object sender, EventArgs e)
        {
            /// \see Process_Click(object)
            this.Process_Click(sender);
        }
        List<Selected> menu;
        private void FilterMenuApplicationBarIconButton_Click(object sender, EventArgs e)
        {
            if (!Selected)
            {
                this.Selected = true;
                menu = new List<Selected>();
                
                Price = ServiceDetailDAO.GetPriceWithDataContent(MainPage.result);
                Price.Sort();
                foreach (int i in Price)
                {
                    Selected item = new Selected(i.ToString());
                    menu.Add(item);
                }
                this.selectedPrice.ItemsSource = menu;
                this.ComboBoxPrice.Visibility = System.Windows.Visibility.Visible;
                this.ResultsList.Visibility = System.Windows.Visibility.Collapsed;
            }
        }

        Point mousePriceDown = new Point(-1, -1);
        Point mousePriceUp = new Point(0, 0);
        private void selectedPrice_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            mousePriceDown = e.GetPosition((ListBox)sender);
        }

        private void selectedPrice_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            mousePriceUp = e.GetPosition((ListBox)sender);
            if (mousePriceDown.Equals(mousePriceUp))
            {
                this.ComboBoxPrice.Visibility = System.Windows.Visibility.Collapsed;
                this.ResultsList.Visibility = System.Windows.Visibility.Visible;
                mousePriceUp = new Point(0, 0);
                mousePriceDown = new Point(-1, -1);
                this.Selected = false;
                this.ResultsList.ItemsSource =  Filter.GetDatafromPrice(MainPage.result, Price[((ListBox)sender).SelectedIndex]);
            }
        }
        Point mouseStreetDown = new Point(-1, -1);
        Point mouseStreetUp = new Point(0, 0);
        private void selectedStreet_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            mouseStreetDown = e.GetPosition((ListBox)sender);
        }

        private void selectedStreet_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            mouseStreetUp = e.GetPosition((ListBox)sender);
            if (mouseStreetDown.Equals(mouseStreetUp))
            {
                this.ComboBoxStreet.Visibility = System.Windows.Visibility.Collapsed;
                this.ResultsList.Visibility = System.Windows.Visibility.Visible;
                mouseStreetUp = new Point(0, 0);
                mouseStreetDown = new Point(-1, -1);
                this.ResultsList.ItemsSource = Filter.GetDatafromStreet(MainPage.result, this.lstStreet[((ListBox)sender).SelectedIndex].StreetName);
                this.Selected = false;
            }
        }

        private void LocationApplicationBarIconButton_Click(object sender, EventArgs e)
        {
            getStreets();
            this.ResultsList.Visibility = System.Windows.Visibility.Collapsed;
            this.ComboBoxStreet.Visibility = System.Windows.Visibility.Visible;
        }

        private void DecreaseChecked(object sender, RoutedEventArgs e)
        {
            this.ResultsList.ItemsSource = Filter.SortStreetName(MainPage.result, false);
            this.ResultsList.Visibility = System.Windows.Visibility.Visible;
            this.ComboBoxStreet.Visibility = System.Windows.Visibility.Collapsed;
        }

        private void IncreaseChecked(object sender, RoutedEventArgs e)
        {
            this.ResultsList.ItemsSource = Filter.SortStreetName(MainPage.result, true);
            this.ResultsList.Visibility = System.Windows.Visibility.Visible;
            this.ComboBoxStreet.Visibility = System.Windows.Visibility.Collapsed;
        }

        public List<string> filterServiceName(List<ContentDataDTO> datas)
        {
            lstService = new List<string>();
            lstService = (from info in datas
                   select info.ServiceName).Distinct().ToList();
            return lstService;
        }

        public List<ContentDataDTO> filterServiceName(string serviceName)
        {
            List<ContentDataDTO> lst = new List<ContentDataDTO>();
            lst = (from info in MainPage.result
                   where info.ServiceName.CompareTo(serviceName) == 0
                   select info).ToList();
            return lst;
        }

        private void NearApplicationBarIconButton_Click(object sender, EventArgs e)
        {
            this.selectedService.ItemsSource = this.filterServiceName(MainPage.result);
            this.ResultsList.Visibility = System.Windows.Visibility.Collapsed;
            this.ComboBoxService.Visibility = System.Windows.Visibility.Visible;
        }

        Point mouseServiceDown = new Point(-1, -1);
        Point mouseServiceUp = new Point(0, 0);
        private void selectedService_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            mouseServiceUp = e.GetPosition((ListBox)sender);
            if (mouseServiceDown.Equals(mouseServiceUp))
            {
                this.ComboBoxService.Visibility = System.Windows.Visibility.Collapsed;
                this.ResultsList.Visibility = System.Windows.Visibility.Visible;
                mouseServiceUp = new Point(0, 0);
                mouseServiceDown = new Point(-1, -1);
                this.ResultsList.ItemsSource = this.filterServiceName(this.lstService[((ListBox)sender).SelectedIndex]); 
                this.Selected = false;
            }
        }

        private void selectedService_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            mouseServiceDown = e.GetPosition((ListBox)sender);
        }

        private void Cancel_Click(object sender, MouseButtonEventArgs e)
        {
            this.Selected = false;
            this.ComboBoxPrice.Visibility = System.Windows.Visibility.Collapsed;
            this.ComboBoxStreet.Visibility = System.Windows.Visibility.Collapsed;
            this.ComboBoxService.Visibility = System.Windows.Visibility.Collapsed;
            this.ResultsList.Visibility = System.Windows.Visibility.Visible;
        }
    }

}